/*
 * texto.c
 *
 *  Created on: 31/05/2011
 *      Author: fernando
 */

#include <string.h>
#include <stdlib.h>
#include "texto.h"

//#include <stdio.h>

Texto *novoTexto(char nome[MAXTEXTO]) {
	Texto *t;

	t = (Texto *) malloc(sizeof(Texto));
	t->nome = (char *) malloc (sizeof(char) * (strlen(nome) + 1));
	strcpy(t->nome, nome);
	return t;
}

void inicializaNoTexto(NoTexto **l) {
	*l = NULL;
}

void inicializaListaTexto(ListaTexto **l) {
	*l = NULL;
}

void insereNoTexto(Linha *linha, Texto *t, NoTexto **l) {
	NoTexto *p;
	p = *l;
	while(p != NULL) {
		if((*l)->tex == t){
			insereNoLinha(linha, &(p->linhas));
			return;
		}
		p = (*l)->prox;
	}
	p = (NoTexto *) malloc(sizeof(NoTexto));
	p->prox = *l;
	inicializaNoLinha(&(p->linhas));
	p->tex = t;
	insereNoLinha(linha, &(p->linhas));
	*l = p;
}

void insereListaTexto(char *nome, ListaTexto **l) {
	ListaTexto *p;

	for(p = *l; p != NULL; p = p->prox) {
		if(strcmp(nome, p->nome) == 0)
			return;
	}
	p = (ListaTexto *) malloc(sizeof(ListaTexto));
	p->prox = *l;
	strcpy(p->nome, nome);
	*l = p;
}

void removeDuplicatasTextos(NoTexto **t) {
	NoTexto *p;

	p = *t;
	while(p != NULL) {
		removeDuplicatasLinhas(&(p->linhas));
		p = p->prox;
	}
}

NoTexto *buscaTexto(Texto *tex, NoTexto *textos) {
	NoTexto *p;

	p = textos;

	while(p != NULL) {
		if(p->tex == tex)
			return p;
		p = p->prox;
	}

	return NULL;
}

void intersecaoTextos(NoTexto **a, NoTexto *b) {
	NoTexto *pA, *pB;

	pA = *a;

	while(pA != NULL) {
		pB = buscaTexto(pA->tex, b);
		if(pB != NULL) {
			intersecaoLinhas(&(pA->linhas), pB->linhas);
			pA = pA->prox;
		}
		else
			removeNoTexto(pA, a);
	}
}

void menosTextos(NoTexto **a, NoTexto *b) {
	NoTexto *pA, *pB;

	pA = *a;

	while(pA != NULL) {
		pB = buscaTexto(pA->tex, b);
		if(pB != NULL)
			menosLinhas(&(pA->linhas), pB->linhas);
		pA = pA->prox;
	}
}

void removeNoTexto(NoTexto *p, NoTexto **textos) {
	NoTexto *aux, *p1;

	if(p == *textos) {
		aux = *textos;
		*textos = aux->prox;
		free(aux);
		return;
	}

	p1 = *textos;

	while(p1 != NULL) {
		if(p1->prox == p) {
			p1->prox = p->prox;
			aux = p;
			free(aux);
			return;
		}
		p1 = p1->prox;
	}
}
